\subsection{Память}

Иногда вы можете услышать от программистов на Си++ \q{выделить память на/в стеке} и/или \q{выделить память в \glslink{heap}{куче}}.

Выделение памяти \IT{на стеке}:

\begin{lstlisting}[style=customc]
void f()
{
	...

	Class o=Class(...);

	...
};
\end{lstlisting}

Память для объекта (или структуры) выделяется в стеке, при помощи простого сдвига \ac{SP}.
Память освобождается во время выхода из ф-ции, или, более точно, в конце \IT{области видимости} (\IT{scope})---\ac{SP}
возвращается в своё состояние (такое же, как при старте ф-ции) и вызывается деструктор класса \IT{Class}.
В такой же манере, выделяется и освобождается память для структуры в Си.

Выделение памяти для объекта \IT{в \glslink{heap}{куче}}:

\begin{lstlisting}[style=customc]
void f1()
{
	...

	Class *o=new Class(...);

	...
};

void f2()
{
	...

	delete o;

	...
};
\end{lstlisting}

\myindex{\CStandardLibrary!malloc()}
\myindex{\CStandardLibrary!free()}
Это то же самое, как и выделять память для структуры используя ф-цию \IT{malloc()}.
На самом деле, \IT{new} в Си++ это \IT{wrapper} для \IT{malloc()}, а \IT{delete} это \IT{wrapper} для \IT{free()}.
Т.к., блок памяти был выделен в \glslink{heap}{куче}, он должен быть освобожден явно, используя \IT{delete}.
Деструктор класса будет автоматически вызван прямо перед этим моментом.

Какой метод лучше?
Выделение \IT{на стеке} очень быстрое и подходит для маленьких объектов с коротким сроком жизни, которые будут использоваться
только в текущей ф-ции.

Выделение \IT{в куче} медленнее, и лучше для объектов с долгим сроком жизни, которые будут использоваться в нескольких
(или многих) ф-циях.
Также, объекты выделенные в \glslink{heap}{куче} подвержены утечкам памяти, потому что их нужно освобождать явно, но об этом
легко забыть.

Так или иначе, это дело вкуса.
